既然在上一張讀到 EXE 執行檔通常會單獨執行而不會進行 DLL 重載,那是不是代表就算沒有重載表也是沒問題的呢? 是不是也可以透過修改 Header
幫程式來瘦身? 做個實驗來驗證看看吧
檔案位置 :
https://github.com/Dinlon5566/IT_Reverse_Engineering/tree/main/Dx14
.reloc
區間的程式,會導致錯誤透過毀損或清空 DLL重載表
的區塊 ( .reloc
) 來驗證 EXE 檔案對 DLL重載表
的依賴性。
5000 ~ 515C RVA
→ 2200 ~ 235C RAW
0x00
後儲存。看起來成功了,這個假設應該是對的。那進一步來修改標頭檔,改變檔案的結構使這個區塊消失也不會影響到執行。
為甚麼不能直接刪除然後執行就好 ? 因為建置的時候系統會發現大小跟區塊對不上就不讓你執行QQ
範例 : helloworld_break.exe
那要甚麼才能讓 windows 覺得這是正常的區塊與大小呢 ?
.reloc
區塊首先先確認區塊位置,發現是在 2200~2400
,那剛好就是文件 2200
後全部資料,使用 Hex Editor 刪掉這個區塊。
NumberOfSelctions
這個區塊儲存有多少個區塊,既然把 .reloc
刪了就要減少一個區塊。將 05
改成 04
。
( 這個區塊的位置是 IMAGE_NT_HEADERS->FileHeader.NumberOfSections
)
現在看到原本的 ImageSize
大小是 6000
,不過經過修改後要甚麼計算呢 ?
看到上面的區塊資料表,查到原本 .reloc
的 Virtual Size
為15C
。
根據動態區段對齊大小
( Section Alignment Size
) 取到 ( 1000 / 15C ) * 1000 = 1000
。
先解釋一下,資料的儲存是以區塊為單位以避免外部碎片化。所以當要存一份資料時就給他分配足夠的區塊。
所以區塊刪除後的大小就是 6000 - 1000 = 5000
。
完成後執行看看 :
成功了 ! 而且大小由 9216
變成 8704
,瘦了一點點。
大大我有事想詢問,我目前作業需要參考您的文章,在Dx14文章底下的這段""根據動態區段對齊大小(Section Alignment Size)取到(1000/15C)1000=1000"",好奇問要如何算為什麼結果是1000呢,是不是我算錯了:(
抱歉這個寫法有些不直觀。
這個式子這樣寫是在試圖找出多少個 .reloc
區段可以填滿一個對齊單位,然後再乘以對齊單位。在這個情況下,由於 15C
(即 348 Bytes)遠小於對齊單位 1000
(即 4 KB),所以一個對齊單位就足夠存儲這個 .reloc
區段,故結果為 1000。
不過要直接計算Virtual Size 占用區塊的數量可以使用這個式子: